import mongoose, { Document, Schema } from 'mongoose';

export interface IFile extends Document {
    // 📁 基础信息
    originalName: string,         // 原始文件名（如 "合同.pdf"）
    filename: string,             // 存储用的唯一文件名（如 "a1b2c3d4.pdf"）
    mimeType: string,             // MIME 类型（如 "application/pdf", "image/jpeg"）
    size: number,                 // 文件大小（字节，如 102400）
    url: string,                  // 可访问的完整 URL（如 "https://cdn.example.com/uploads/..."）
    createdBy: mongoose.Schema.Types.ObjectId,
    updatedBy?: mongoose.Schema.Types.ObjectId,
    // 🕒 时间
    uploadedAt: Date,             // 上传时间
    createdAt: Date               // 创建时间（通常 = uploadedAt）
}

const fileSchema = new Schema<IFile>({
    // 核心必填字段
    originalName: {
        type: String,
        required: [true, '原始文件名是必填项'],
        trim: true
    },
    filename: {
        type: String,
        required: [true, '存储用文件名是必填项'],
        trim: true
    },
    mimeType: {
        type: String,
        required: [true, 'MIME 类型是必填项'],
        trim: true
    },
    size: {
        type: Number,
        required: [true, '文件大小是必填项'],
        min: [0, '文件大小必须大于等于 0']
    },
    url: {
        type: String,
        required: [true, '可访问 URL 是必填项'],
        trim: true
    },
    createdBy: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
        required: [true, '创建人是必填项'],
    },
    updatedBy: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
        required: [true, '更新人是必填项'],
    },


}, {
    timestamps: true // 自动添加 createdAt 和 updatedAt
});

// 创建索引
fileSchema.index({ createdAt: -1 });

// 虚拟字段（不存储在数据库中）
fileSchema.virtual('displayName').get(function () {
    return `${this.originalName} (${this.filename})`;
});

// 实例方法
fileSchema.methods.toJSON = function () {
    const tenant = this.toObject();
    return tenant;
};

// 静态方法
fileSchema.statics.findByRole = function (role: string) {
    return this.find({ role, isActive: true });
};

export const File = mongoose.model<IFile>('File', fileSchema);
